package com.cn.JUC.pattern.case21;

/**
 * @Title 终止线程案例
 * @Description 线程何时真正终止不再由其它线程决定，而是自行处理。来源：https://www.zhihu.com/question/41048032/answer/89431513
 * 注意：1）在线程内，自行检测terminated；2）如果线程内有sheep，需要复位
 * @Author CAI ZHAI
 * @Date 2021/9/14 16:17
 **/
class Proxy {
    //线程终止标志位
    volatile boolean terminated = false;
    boolean started = false;
    //采集线程
    Thread rptThread;
    //启动采集功能
    synchronized void start(){
        //不允许同时启动多个采集线程
        if (started) {
            return;
        }
        started = true;
        terminated = false;
        rptThread = new Thread(()->{
            while (!terminated){
                //省略采集、回传实现
                report();
                //每隔两秒钟采集、回传一次数据
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e){//当你捕获到InterruptedException异常后，当前线程的中断状态已经被修改为false(表示线程未被中断)；所以重新设置线程中断状态。
                    //重新设置线程中断状态
                    Thread.currentThread().interrupt();
                }
            }
            //执行到此处说明线程马上终止
            started = false;
        });
        rptThread.start();
    }
    
    private void report(){
    }
    
    //终止采集功能
    synchronized void stop(){
        //设置中断标志位
        terminated = true;
        //中断线程rptThread
        rptThread.interrupt();
    }
}